package com.dzxy.control;

import com.dzxy.bean.UserBean;
import com.dzxy.modal.UserInfoModal;
import com.dzxy.utils.MyUtils;

import javax.servlet.ServletException;
import javax.servlet.annotation.MultipartConfig;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.Part;
import java.io.File;
import java.io.IOException;
import java.util.List;
import java.util.UUID;

@WebServlet("/UserInfoAddWithFileUploadServlet")
@MultipartConfig(maxFileSize = 5 * 1024 * 1024)  // 5M大小   解析时就会处理form表单中的二进制流对象
public class UserInfoAddWithFileUploadServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

        /////////////////////////////////////////////////这部分内容在高级框架中是自动实现（由springmvc的数据类型自动转换解决）/////////////
        // 参考：https://gitee.com/climpeaker/zb_webproject0920.git

        // 1、使用request的getParameter方法获取表单数据封装存储到javabean中

        // 获取用户端页面发送的表单数据
        // 创建一个实体类实例对象----作用：作为参数传递的载体
        UserBean userB = new UserBean();
        // 将从request中获取的表单数据设置给参数实体类
        userB.setUserName(request.getParameter("userName")); // 参数名要和form表单中的name属性值保持一致
        userB.setUserPsw(request.getParameter("userPsw"));
        userB.setUserAddress(request.getParameter("userAddress"));
        userB.setUserTel(request.getParameter("userTel"));
        userB.setUserRegDate(MyUtils.convertString2Date(request.getParameter("userRegDate"), "yyyy-MM-dd"));

        // 从request对象中，获取form表单中的文件流对象,这个文件流对象，就放在part中，通过文件对象控件的name属性值获取文件流对象
        Part partUserImg = request.getPart("userImg"); // 获取的form表单的文件对象； 参数是form表单的 file控件的name属性值


        // 打印part对象
        System.out.println("partUserImg:");
        // 获取上传文件的原文件名
        String str01dFileName=partUserImg.getName();// 获取的是文件控件的name属性的值(数据库的列名)
        System.out.println("fileNmae:"+str01dFileName);

        String strPath = request.getServletContext().getContextPath();
        System.out.println(partUserImg.getSubmittedFileName()); // 上传文件的原始名字 user.png
        System.out.println(partUserImg.getContentType()); // 原始文件的Content类型  image/png
        System.out.println("getContextPath:" + request.getServletContext().getContextPath());  //getContextPath:/javawebup20200415_war_exploded
        // getRealPath：D:\yuwworkspace\QSTWorkspace\QSTWorkspace_DZ202003\dz_javaweb20200415\out\artifacts\dz_javaweb20200415_war_exploded\fileUpload
        System.out.println("getRealPath：" + request.getServletContext().getRealPath("/"));
        System.out.println("getRealPath：" + request.getServletContext().getRealPath("fileUpload")); // 项目发布的服务器上文件保存的目录

        System.out.println(partUserImg);
        //partUserImg.write("");

        // 将文件上传到服务器指定目录
        // (1) 给上传文件进行重命名【避免重复】
        // 获取上传文件的后缀名
        String fileSubfix = "jpg"; // 默认类型为jpg  // 需要根据业务逻辑确定
        String[] arrContentType = partUserImg.getSubmittedFileName().split("\\.");  // 上传文件的原始名字 user.png
        if (arrContentType != null && arrContentType.length > 0) {
            fileSubfix = arrContentType[arrContentType.length - 1];
        }

        // 使用字符串操作获取后缀名
        //String strfileSubfix2 = partUserImg.getSubmittedFileName().substring(partUserImg.getSubmittedFileName().lastIndexOf(".")+1);  // ?


//        // 获取上传文件的文件后缀
////        // 上传文件的原始名字
////        String submitFileName = part.getSubmittedFileName();
////        // 提出文件的后缀
////        // 使用正则表达式提取文件的后缀类型
////        // 提取后缀的正在表达式
////        Pattern pattern = Pattern.compile("\\.\\w+$");
////        // 现在创建 matcher 对象
////        Matcher matcher = pattern.matcher(submitFileName);
////        // 文件类型后缀:默认类型为 .dat
////        String strFileType = ".dat";
////        if (matcher.find()) {
////            // 获取匹配结果
////            strFileType = matcher.group();
////        }


        // UUID工具类，进行文件新文件命名，避免文件名的重复
        String strNewFileName = UUID.randomUUID().toString() + "." + fileSubfix;
        // (2) 创建上传文件保存的目录文件夹
        // D:\yuwworkspace\QSTWorkspace\QSTWorkspace_DZ202003\dz_javaweb20200415\out\artifacts\dz_javaweb20200415_war_exploded\fileUpload
        String strServerFilePath = request.getServletContext().getRealPath("fileUpload"); // 要求在开发项目的web目录下新建一个fileUpload文件夹
        // 检查该文件夹是否在服务器已经创建，如果没有创建，则先创建在使用
        // file工具类
        File fileServerFilePath = new File(strServerFilePath);
        if (!fileServerFilePath.exists()) {
            // 创建目录
            fileServerFilePath.mkdirs();
        }

        // (3) 使用新的文件名上传文件到服务器指定目录
        // 上传文件的完整路径名字
        String strUploadFileName = strServerFilePath + "/" + strNewFileName; // 上传文件的绝对路径
        try {
            partUserImg.write(strUploadFileName); // 以write写出的方式将文件内容使用给定的文件名（ strUploadFileName ）写到指定的服务器上
        } catch (IOException e) {
            System.out.println("文件上传异常：" + e.getMessage());
        }

        // 将文件上传到服务器的相对于 / 目录的路径名保存到数据库
        String strRelativeUploadFileName = "fileUpload" + "/" + strNewFileName; // 相对路径名
        // 保存到实体类的文件对象的userImg属性上
        userB.setUserImg(strRelativeUploadFileName);

        //////////////////////////////////////////////这部分内容在高级框架中是自动实现///////////////////////////////////////////////////////////

        // 2、调用modal层进行业务逻辑处理（modal层再调用数据库操作进行数据库处理）
        // 创建modal业务逻辑处理的实例类对象
        UserInfoModal userInfoM = new UserInfoModal();  // spring 的依赖注入解决
        // 用户信息新增处理
        int i = userInfoM.addUserInfo(userB);

        // 3、根据modal层的业务逻辑处理结果，进行新增结果显示页面跳转显示

        // 新增成功
        // 查询一下数据库，将所有的用户信息进行显示，并将最新添加的数据显示在最前面（主键倒序排列）

        List<UserBean> list = userInfoM.getAllUserInfo(true);
        // 将需要在页面上显示的数据缓存到jsp的四大作用域中；一般常用的是 request和session
        request.getSession().setAttribute("lstAllUserInfo", list);  // 缓存到session作用域对象中
        // 转发   logined.jsp页面(转发或重定向 二选一)
        request.getRequestDispatcher("WEB-INF/userManger/userInfoAddDetail_fileupload.jsp").forward(request, response);
        // 重定向   logined.jsp页面(转发或重定向 二选一)
        //response.sendRedirect("logined.jsp");
    }
}
